package models

import (
	"strconv"
	"time"

	"github.com/astaxie/beego"
	"github.com/astaxie/beego/orm"
)

// 购买机票的处理流程
// 1.查询Aline表获取所要购买的机票的相关信息
// 2.检查航班状态，是否有余座
// 3.检查日期是否有误，起飞前1小时停止售票
// 4.检查Order表，查看用户的机票信息是否有冲突
// 5.如果一切正常执行购票
// 6.微信支付
// ××××××××××××××××××××××××××××××××××××××××××××××××
// 返回状态值说明：
// 0：购买成功
// 1：购买失败，用户不存在
// 2：购买失败，航班不存在
// 3：购买失败，参数信息格式错误
// 4：购买失败，航班取消
// 5：购买失败，时间错误
// 6：购买失败，航班冲突
// 7：购买失败，系统故障
// 8：购买失败，未知原因
// 9：购买失败，未付款
// 10：购买错误，没有余票
func Purchase(name, aline string) int8 {
	user, status1 := CheckUsr(name)
	if status1 == 1 {
		// 1：购买失败，用户不存在
		return 1
	}
	alineid, err := strconv.ParseInt(aline, 10, 64)
	beego.Error(aline)
	ALINE, status2 := CheckAline(alineid)
	if err != nil {
		// 3：购买失败，参数信息格式错误
		beego.Error(err)
		return 3
	}
	if status2 == 2 {
		// 2：购买失败，航班不存在
		return 2
	}
	// status参数信息：
	// 0：航班正常
	// 1：航班延误
	// 2：航班取消
	// 3：其他情况
	if ALINE.Status == 2 {
		// 4：购买失败，航班取消
		return 4
	}

	userseat, statusseat := Checkalineseat(ALINE.Id)
	if statusseat != 0 {
		// 10：购买错误，没有余票
		return 10
	}
	nowTime := time.Now()
	if nowTime.After(ALINE.Begintime) ||
		(ALINE.Begintime.YearDay() == nowTime.YearDay() && (ALINE.Begintime.Hour()-nowTime.Hour()) <= 1) {
		// 5：购买失败，时间错误
		return 5
	}
	orders, nums, status3 := Checkuserorder(user.Id)
	if status3 == 0 && nums > 0 {
		for _, ord := range orders {
			a, status := CheckAline(ord.Alineid)
			if status == 0 {
				if (ALINE.Begintime.Before(a.Begintime) && ALINE.Endtime.After(a.Begintime)) ||
					ALINE.Begintime.Before(a.Endtime) && ALINE.Endtime.After(a.Endtime) ||
					ALINE.Begintime.Equal(a.Begintime) ||
					ALINE.Begintime.Equal(a.Endtime) ||
					ALINE.Endtime.Equal(a.Begintime) ||
					ALINE.Endtime.Equal(a.Endtime) {
					// 6：购买失败，航班冲突
					return 6
				}
			} else {
				// 7：购买失败，系统故障
				return 7
			}

		}
	}
	if status3 != 0 {
		// 7：购买失败，系统故障
		return 7
	}

	o := orm.NewOrm()
	// 执行购票
	if user.Balance >= ALINE.Price {
		// 更新用户余额数据
		user.Balance = user.Balance - ALINE.Price
		o.Update(user)
		//更新座位数据
		userseat.IsOrdered = true
		userseat.Userid = user.Id
		o.Update(userseat)
		userorder := new(Order)
		//在订单表插入数据
		userorder.Alineid = ALINE.Id
		userorder.Userid = user.Id
		userorder.Number = GetRandomString(11)
		o.Insert(userorder)
	} else {
		// 9：购买失败，未付款
		return 9
	}

	return 0
}


